<template>
  <a-modal
      :confirmLoading="confirmLoading"
      :visible="visible"
      :width="modalWidth"
      cancelText="关闭"
      title="cron表达式"
      @cancel="close"
      @ok="change">
    <div class="card-container">
      <a-tabs type="card">
        <a-tab-pane key="1" type="card">
          <span slot="tab"><a-icon type="schedule"/> 秒</span>
          <a-radio-group v-model="result.second.cronEvery">
            <a-row>
              <a-radio value="1">每一秒钟</a-radio>
            </a-row>
            <a-row>
              <a-radio value="2">每隔
                <a-input-number v-model="result.second.incrementIncrement" :max="60" :min="1"
                                size="small"></a-input-number>
                秒执行 从
                <a-input-number v-model="result.second.incrementStart" :max="59" :min="0" size="small"></a-input-number>
                秒开始
              </a-radio>
            </a-row>
            <a-row>
              <a-radio value="3">具体秒数(可多选)</a-radio>
              <a-select v-model="result.second.specificSpecific" mode="multiple" size="small" style="width:354px;">
                <a-select-option v-for="(val,index) in 60" :key="index" :value="index">{{ index }}</a-select-option>
              </a-select>
            </a-row>
            <a-row>
              <a-radio value="4">周期从
                <a-input-number v-model="result.second.rangeStart" :max="60" :min="1" size="small"></a-input-number>
                到
                <a-input-number v-model="result.second.rangeEnd" :max="59" :min="0" size="small"></a-input-number>
                秒
              </a-radio>
            </a-row>
          </a-radio-group>
        </a-tab-pane>
        <a-tab-pane key="2">
          <span slot="tab"><a-icon type="schedule"/>分</span>
          <div class="tabBody">
            <a-radio-group v-model="result.minute.cronEvery">
              <a-row>
                <a-radio value="1">每一分钟</a-radio>
              </a-row>
              <a-row>
                <a-radio value="2">每隔
                  <a-input-number v-model="result.minute.incrementIncrement" :max="60" :min="1"
                                  size="small"></a-input-number>
                  分执行 从
                  <a-input-number v-model="result.minute.incrementStart" :max="59" :min="0"
                                  size="small"></a-input-number>
                  分开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio value="3">具体分钟数(可多选)</a-radio>
                <a-select v-model="result.minute.specificSpecific" mode="multiple" size="small" style="width:340px;">
                  <a-select-option v-for="(val,index) in Array(60)" :key="index" :value="index"> {{
                      index
                    }}
                  </a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio value="4">周期从
                  <a-input-number v-model="result.minute.rangeStart" :max="60" :min="1" size="small"></a-input-number>
                  到
                  <a-input-number v-model="result.minute.rangeEnd" :max="59" :min="0" size="small"></a-input-number>
                  分
                </a-radio>
              </a-row>
            </a-radio-group>
          </div>
        </a-tab-pane>
        <a-tab-pane key="3">
          <span slot="tab"><a-icon type="schedule"/> 时</span>
          <div class="tabBody">
            <a-radio-group v-model="result.hour.cronEvery">
              <a-row>
                <a-radio value="1">每一小时</a-radio>
              </a-row>
              <a-row>
                <a-radio value="2">每隔
                  <a-input-number v-model="result.hour.incrementIncrement" :max="23" :min="0"
                                  size="small"></a-input-number>
                  小时执行 从
                  <a-input-number v-model="result.hour.incrementStart" :max="23" :min="0" size="small"></a-input-number>
                  小时开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio class="long" value="3">具体小时数(可多选)</a-radio>
                <a-select v-model="result.hour.specificSpecific" mode="multiple" size="small" style="width:340px;">
                  <a-select-option v-for="(val,index) in Array(24)" :key="index">{{ index }}</a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio value="4">周期从
                  <a-input-number v-model="result.hour.rangeStart" :max="23" :min="0" size="small"></a-input-number>
                  到
                  <a-input-number v-model="result.hour.rangeEnd" :max="23" :min="0" size="small"></a-input-number>
                  小时
                </a-radio>
              </a-row>
            </a-radio-group>
          </div>
        </a-tab-pane>
        <a-tab-pane key="4">
          <span slot="tab"><a-icon type="schedule"/>  天</span>
          <div class="tabBody">
            <a-radio-group v-model="result.day.cronEvery">
              <a-row>
                <a-radio value="1">每一天</a-radio>
              </a-row>
              <a-row>
                <a-radio value="2">每隔
                  <a-input-number v-model="result.week.incrementIncrement" :max="7" :min="1"
                                  size="small"></a-input-number>
                  周执行 从
                  <a-select v-model="result.week.incrementStart" size="small">
                    <a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{
                        weekDays[index]
                      }}
                    </a-select-option>
                  </a-select>
                  开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio value="3">每隔
                  <a-input-number v-model="result.day.incrementIncrement" :max="31" :min="1"
                                  size="small"></a-input-number>
                  天执行 从
                  <a-input-number v-model="result.day.incrementStart" :max="31" :min="1" size="small"></a-input-number>
                  天开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio class="long" value="4">具体星期几(可多选)</a-radio>
                <a-select v-model="result.week.specificSpecific" mode="multiple" size="small" style="width:340px;">
                  <a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{
                      weekDays[index]
                    }}
                  </a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio class="long" value="5">具体天数(可多选)</a-radio>
                <a-select v-model="result.day.specificSpecific" mode="multiple" size="small" style="width:354px;">
                  <a-select-option v-for="(val,index) in Array(31)" :key="index" :value="index">{{
                      index + 1
                    }}
                  </a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio value="6">在这个月的最后一天</a-radio>
              </a-row>
              <a-row>
                <a-radio value="7">在这个月的最后一个工作日</a-radio>
              </a-row>
              <a-row>
                <a-radio value="8">在这个月的最后一个
                  <a-select v-model="result.day.cronLastSpecificDomDay" size="small">
                    <a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{
                        weekDays[index]
                      }}
                    </a-select-option>
                  </a-select>
                </a-radio>
              </a-row>
              <a-row>
                <a-radio value="9">
                  <a-input-number v-model="result.day.cronDaysBeforeEomMinus" :max="31" :min="1"
                                  size="small"></a-input-number>
                  在本月底前
                </a-radio>
              </a-row>
              <a-row>
                <a-radio value="10">最近的工作日（周一至周五）至本月
                  <a-input-number v-model="result.day.cronDaysNearestWeekday" :max="31" :min="1"
                                  size="small"></a-input-number>
                  日
                </a-radio>
              </a-row>
              <a-row>
                <a-radio value="11">在这个月的第
                  <a-input-number v-model="result.week.cronNthDayNth" :max="5" :min="1" size="small"></a-input-number>
                  个
                  <a-select v-model="result.week.cronNthDayDay" size="small">
                    <a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{
                        weekDays[index]
                      }}
                    </a-select-option>
                  </a-select>

                </a-radio>
              </a-row>
            </a-radio-group>
          </div>
        </a-tab-pane>
        <a-tab-pane key="5">
          <span slot="tab"><a-icon type="schedule"/> 月</span>
          <div class="tabBody">
            <a-radio-group v-model="result.month.cronEvery">
              <a-row>
                <a-radio value="1">每一月</a-radio>
              </a-row>
              <a-row>
                <a-radio value="2">每隔
                  <a-input-number v-model="result.month.incrementIncrement" :max="12" :min="0"
                                  size="small"></a-input-number>
                  月执行 从
                  <a-input-number v-model="result.month.incrementStart" :max="12" :min="0"
                                  size="small"></a-input-number>
                  月开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio class="long" value="3">具体月数(可多选)</a-radio>
                <a-select v-model="result.month.specificSpecific" filterable mode="multiple" size="small"
                          style="width:354px;">
                  <a-select-option v-for="(val,index) in Array(12)" :key="index" :value="index">{{
                      index + 1
                    }}
                  </a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio value="4">从
                  <a-input-number v-model="result.month.rangeStart" :max="12" :min="1" size="small"></a-input-number>
                  到
                  <a-input-number v-model="result.month.rangeEnd" :max="12" :min="1" size="small"></a-input-number>
                  月之间的每个月
                </a-radio>
              </a-row>
            </a-radio-group>
          </div>
        </a-tab-pane>
        <a-tab-pane key="6">
          <span slot="tab"><a-icon type="schedule"/> 年</span>
          <div class="tabBody">
            <a-radio-group v-model="result.year.cronEvery">
              <a-row>
                <a-radio value="1">每一年</a-radio>
              </a-row>
              <a-row>
                <a-radio value="2">每隔
                  <a-input-number v-model="result.year.incrementIncrement" :max="99" :min="1"
                                  size="small"></a-input-number>
                  年执行 从
                  <a-input-number v-model="result.year.incrementStart" :max="2119" :min="2019"
                                  size="small"></a-input-number>
                  年开始
                </a-radio>
              </a-row>
              <a-row>
                <a-radio class="long" value="3">具体年份(可多选)</a-radio>
                <a-select v-model="result.year.specificSpecific" filterable mode="multiple" size="small"
                          style="width:354px;">
                  <a-select-option v-for="(val,index) in Array(100)" :key="index" :value="2019+index">{{
                      2019 + index
                    }}
                  </a-select-option>
                </a-select>
              </a-row>
              <a-row>
                <a-radio value="4">从
                  <a-input-number v-model="result.year.rangeStart" :max="2119" :min="2019"
                                  size="small"></a-input-number>
                  到
                  <a-input-number v-model="result.year.rangeEnd" :max="2119" :min="2019" size="small"></a-input-number>
                  年之间的每一年
                </a-radio>
              </a-row>
            </a-radio-group>
          </div>
        </a-tab-pane>
      </a-tabs>
      <div class="bottom">
        <span class="value">{{ this.cron.label }}</span>
      </div>
    </div>
  </a-modal>
</template>
<script>
export default {
  name: 'VueCron',
  props: ['data', 'i18n'],
  data() {
    return {
      visible: false,
      confirmLoading: false,
      size: 'large',
      weekDays: ['天', '一', '二', '三', '四', '五', '六'].map(val => '星期' + val),
      result: {
        second: {
          cronEvery: '',
          incrementStart: 3,
          incrementIncrement: 5,
          rangeStart: 1,
          rangeEnd: 0,
          specificSpecific: [],
        },
        minute: {
          cronEvery: '',
          incrementStart: 3,
          incrementIncrement: 5,
          rangeStart: 1,
          rangeEnd: '0',
          specificSpecific: [],
        },
        hour: {
          cronEvery: '',
          incrementStart: 3,
          incrementIncrement: 5,
          rangeStart: '0',
          rangeEnd: '0',
          specificSpecific: [],
        },
        day: {
          cronEvery: '',
          incrementStart: 1,
          incrementIncrement: '1',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
          cronLastSpecificDomDay: 1,
          cronDaysBeforeEomMinus: '',
          cronDaysNearestWeekday: '',
        },
        week: {
          cronEvery: '',
          incrementStart: 1,
          incrementIncrement: '1',
          specificSpecific: [],
          cronNthDayDay: 1,
          cronNthDayNth: '1',
        },
        month: {
          cronEvery: '',
          incrementStart: 3,
          incrementIncrement: 5,
          rangeStart: 1,
          rangeEnd: 1,
          specificSpecific: [],
        },
        year: {
          cronEvery: '',
          incrementStart: 2017,
          incrementIncrement: 1,
          rangeStart: 2019,
          rangeEnd: 2019,
          specificSpecific: [],
        },
        label: ''
      },
      output: {
        second: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
        },
        minute: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
        },
        hour: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
        },
        day: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
          cronLastSpecificDomDay: '',
          cronDaysBeforeEomMinus: '',
          cronDaysNearestWeekday: '',
        },
        week: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          specificSpecific: [],
          cronNthDayDay: '',
          cronNthDayNth: '',
        },
        month: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
        },
        year: {
          cronEvery: '',
          incrementStart: '',
          incrementIncrement: '',
          rangeStart: '',
          rangeEnd: '',
          specificSpecific: [],
        }
      }
    }
  },
  computed: {
    modalWidth() {
      return 608;
    },
    text() {
      return Language['cn']
    },
    secondsText() {
      let seconds = '';
      let cronEvery = this.result.second.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          seconds = '*';
          break;
        case '2':
          seconds = this.result.second.incrementStart + '/' + this.result.second.incrementIncrement;
          break;
        case '3':
          this.result.second.specificSpecific.map(val => {
            seconds += val + ','
          });
          seconds = seconds.slice(0, -1);
          break;
        case '4':
          seconds = this.result.second.rangeStart + '-' + this.result.second.rangeEnd;
          break;
      }
      return seconds;
    },
    minutesText() {
      let minutes = '';
      let cronEvery = this.result.minute.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          minutes = '*';
          break;
        case '2':
          minutes = this.result.minute.incrementStart + '/' + this.result.minute.incrementIncrement;
          break;
        case '3':
          this.result.minute.specificSpecific.map(val => {
            minutes += val + ','
          });
          minutes = minutes.slice(0, -1);
          break;
        case '4':
          minutes = this.result.minute.rangeStart + '-' + this.result.minute.rangeEnd;
          break;
      }
      return minutes;
    },
    hoursText() {
      let hours = '';
      let cronEvery = this.result.hour.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          hours = '*';
          break;
        case '2':
          hours = this.result.hour.incrementStart + '/' + this.result.hour.incrementIncrement;
          break;
        case '3':
          this.result.hour.specificSpecific.map(val => {
            hours += val + ','
          });
          hours = hours.slice(0, -1);
          break;
        case '4':
          hours = this.result.hour.rangeStart + '-' + this.result.hour.rangeEnd;
          break;
      }
      return hours;
    },
    daysText() {
      let days = '';
      let cronEvery = this.result.day.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          break;
        case '2':
        case '4':
        case '11':
          days = '?';
          break;
        case '3':
          days = this.result.day.incrementStart + '/' + this.result.day.incrementIncrement;
          break;
        case '5':
          this.result.day.specificSpecific.map(val => {
            days += val + ','
          });
          days = days.slice(0, -1);
          break;
        case '6':
          days = "L";
          break;
        case '7':
          days = "LW";
          break;
        case '8':
          days = this.result.day.cronLastSpecificDomDay + 'L';
          break;
        case '9':
          days = 'L-' + this.result.day.cronDaysBeforeEomMinus;
          break;
        case '10':
          days = this.result.day.cronDaysNearestWeekday + "W";
          break
      }
      return days;
    },
    weeksText() {
      let weeks = '';
      let cronEvery = this.result.day.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
        case '3':
        case '5':
          weeks = '?';
          break;
        case '2':
          weeks = this.result.week.incrementStart + '/' + this.result.week.incrementIncrement;
          break;
        case '4':
          this.result.week.specificSpecific.map(val => {
            weeks += val + ','
          });
          weeks = weeks.slice(0, -1);
          break;
        case '6':
        case '7':
        case '8':
        case '9':
        case '10':
          weeks = "?";
          break;
        case '11':
          weeks = this.result.week.cronNthDayDay + "#" + this.result.week.cronNthDayNth;
          break;
      }
      return weeks;
    },
    monthsText() {
      let months = '';
      let cronEvery = this.result.month.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          months = '*';
          break;
        case '2':
          months = this.result.month.incrementStart + '/' + this.result.month.incrementIncrement;
          break;
        case '3':
          this.result.month.specificSpecific.map(val => {
            months += val + ','
          });
          months = months.slice(0, -1);
          break;
        case '4':
          months = this.result.month.rangeStart + '-' + this.result.month.rangeEnd;
          break;
      }
      return months;
    },
    yearsText() {
      let years = '';
      let cronEvery = this.result.year.cronEvery;
      switch (cronEvery.toString()) {
        case '1':
          years = '*';
          break;
        case '2':
          years = this.result.year.incrementStart + '/' + this.result.year.incrementIncrement;
          break;
        case '3':
          this.result.year.specificSpecific.map(val => {
            years += val + ','
          });
          years = years.slice(0, -1);
          break;
        case '4':
          years = this.result.year.rangeStart + '-' + this.result.year.rangeEnd;
          break;
      }
      return years;
    },
    cron() {
      return {
        value: this.result,
        label: `${this.secondsText || '*'} ${this.minutesText || '*'} ${this.hoursText || '*'} ${this.daysText || '*'} ${this.monthsText || '*'} ${this.weeksText || '*'} ${this.yearsText || '*'}`
      }
    },
  },
  watch: {
    data() {
      //this.rest(this.data);
    }
  },
  methods: {
    show() {
      //this.rest(pick(this.data.value,'second','minute','hour','day','week','month','year'));
      //this.rest(this.data.value);
      Object.assign(this.data.value, this.result);
      console.log('data初始化', this.data);
      //this.result = this.data.value;
      this.visible = true;
    },
    getValue() {
      return this.cron;
    },
    change() {
      console.log('返回前', this.cron);
      this.$emit('change', this.cron);
      this.close();
      this.visible = false;
    },
    close() {
      this.visible = false;
      //this.$emit('close')
    },
    rest(data) {
      for (let i in data) {
        console.log(data[i]);
        if (data[i] instanceof Object) {
          this.rest(data[i])
        } else {
          switch (typeof data[i]) {
            case 'object':
              data[i] = [];
              break;
            case 'string':
              data[i] = '';
              break;
            case 'number':
              data[i] = null;
              break;
          }
        }
      }
    },
    callback(key) {
      //console.log(key)
    }
  }
}
</script>

<style lang="less">
.card-container {
  background: #fff;
  overflow: hidden;
  padding: 12px;
  position: relative;
  width: 100%;

  .ant-tabs {
    border: 1px solid #e6ebf5;
    padding: 0;

    .ant-tabs-bar {
      margin: 0;
      outline: none;
      border-bottom: none;

      .ant-tabs-nav-container {
        margin: 0;

        .ant-tabs-tab {
          padding: 0 24px !important;
          background-color: #f5f7fa !important;
          margin-right: 0px !important;
          border-radius: 0;
          line-height: 38px;
          border: 1px solid transparent !important;
          border-bottom: 1px solid #e6ebf5 !important;
        }

        .ant-tabs-tab-active.ant-tabs-tab {
          color: #409eff;
          background-color: #fff !important;
          border-right: 1px solid #e6ebf5 !important;
          border-left: 1px solid #e6ebf5 !important;
          border-bottom: 1px solid #fff !important;
          font-weight: normal;
          transition: none !important;
        }
      }
    }

    .ant-tabs-tabpane {
      padding: 15px;

      .ant-row {
        margin: 10px 0;
      }

      .ant-select, .ant-input-number {
        width: 100px;
      }
    }
  }
}
</style>
<style lang="less" scoped>
.container-widthEn {
  width: 755px;
}

.container-widthCn {
  width: 608px;
}

.language {
  text-align: center;
  position: absolute;
  right: 13px;
  top: 13px;
  border: 1px solid transparent;
  height: 40px;
  line-height: 38px;
  font-size: 16px;
  color: #409eff;
  z-index: 1;
  background: #f5f7fa;
  outline: none;
  width: 47px;
  border-bottom: 1px solid #e6ebf5;
  border-radius: 0;
}

.card-container {
  .bottom {
    display: flex;
    justify-content: center;
    padding: 10px 0 0 0;

    .cronButton {
      margin: 0 10px;
      line-height: 40px;
    }
  }
}

.tabBody {
  .a-row {
    margin: 10px 0;

    .long {
      .a-select {
        width: 354px;
      }
    }

    .a-input-number {
      width: 110px;
    }
  }
}
</style>
